class Person {
  // 静态成员用static关键字定义
  static String name = '李飞'; //静态属性
  static void show(){ //静态方法
    print('这是静态方法,$name'); //静态方法只能访问静态成员，不能访问动态成员
  }

  String Tname = '';
  num age = 18;
  Person(name,age){
    this.Tname = name;
    this.age = age;
  }

  void printInfo(){
    // print('${this.Tname},$name');//非静态方法可以访问静态成员与非静态成员
    // show();//调用静态方法
    print('${this.Tname},${this.age}');
  }
}

class Father {
  String name;
  num age;
  // Father(this.name,this.age);
  Father.show(this.name,this.age);//命名构造函数
  static String user = '静态属性';
  void showInfo(){
    print('这是父类');
  }
}

class Son extends Father{ //继承用关键字extends
  // Son(super.name, super.age);//新版本的写法，super关键字继承父类的属性与方法
  Son(name,age) : super.show(name,age){  //旧版本的写法，super关键字继承父类的属性与方法

  }
  // 覆写父类的方法---与父类的方法同名，将会覆盖掉父类的
  @override //一般加上这个代表是覆写父类的函数
  void showInfo(){
    // print('这是子类');
    super.showInfo();//在子类的函数里调用父类的函数
  }

}
main(){
  // print(Person.name);//静态属性和静态方法只能通过构造函数去访问，不能用实例对象去访问
  // Person p = new Person('狗子');
  // p.printInfo();

  // dart里的对象操作符
  // ? 条件运算符
  // var a;
  // a?.printInfo(); //如果a为空则不会执行问号后面的语句；

  // as 类型转换
  // a = '';
  // a = new Person('张华');
  // (a as Person).printInfo();//转换为Person实例对象

  // is 判断数据类型
  // var a = 88;
  // print(a is num); //判断数据类型---数字可以判断两种数据类型num或者int

  // .. 级联操作(连缀操作) 很常用要记住
  // Person p = new Person('狗子',30);

  // p.printInfo();
  // p..Tname = '村花' //可连贯操作实例对象的赋值和调用方法
  //  ..age = 19
  //  ..printInfo();

  // print(Son.user);//此处会报错，因为静态成员不会被继承
  Father f = new Father.show('小王', 16);
  print(f.name);
  Son s = new Son('小飞',17); //实例化子类
  print(s.name);//继承之后如果父类有的属性或者方法子类也有且同名，那子类的会覆盖父类的
  s.showInfo();
}
